using UnityEngine;
using System.Collections.Generic;
using System.Linq; 
using Debug = UnityEngine.Debug;
using System;
using System.Diagnostics; // For utility/events
using System.Collections;

public class BattleManager : MonoBehaviour
{
    // === 模块依赖 (已通过 Inspector 引用解决查找问题) ===
    [Header("Module Dependencies")]
    [SerializeField] private CardManager cardManager;      
    [SerializeField] private EffectSystem effectSystem;
    [SerializeField] private CardFactory cardFactory;      // CardManager 依赖 CardFactory，BattleManager 辅助引用
    [SerializeField] private ResultManager resultManager;
    [SerializeField] private GameObject battlePage;
    [SerializeField] private GameObject rewardPage;
    // TODO: [SerializeField] private IntentSystem intentSystem;
    // === 战斗状态数据 - 使用具体类型，但内部逻辑依然面向 ITarget ===
    [Header("Battle State")]
    private PlayerData player;
    private List<EnemyData> enemies;
    public int currentTurn { get; private set; } = 0;
    // -----------------------------------------------------------------
    // 1. 初始化战斗流程 
    // -----------------------------------------------------------------
    public void StartBattle(PlayerData player, List<EnemyData> enemies)
    {
        // 1. 初始化战斗数据
        this.player = player;
        this.enemies = enemies;
        currentTurn = 0;

        // 重置所有单位状态
        player.ResetForCombat();
        enemies.ForEach(enemy => enemy.ResetForCombat());

        // 2.检查依赖
        if (cardManager == null || effectSystem == null || cardFactory == null)
        {
            Debug.LogError("核心模块依赖未设置！请在 Inspector 中拖入 CardManager/EffectSystem/CardFactory 组件");
            return;
        }

        // 3.卡牌系统初始化
        List<Card> starterDeck = cardFactory.CreateStarterDeck();
        cardManager.InitializeDeck(starterDeck);
        // [检查点 1]：这里必须调用 RelicManager 的钩子！
        // [新增] 通知遗物管理器战斗开始
        RelicManager relicMgr = FindObjectOfType<RelicManager>();
        if (relicMgr != null)
        {
            relicMgr.InitializeRelics(); // 先根据 ID 创建遗物对象
            relicMgr.OnBattleStart();    // 再触发战斗开始效果
        }
        else
        {
            Debug.LogWarning("未找到 RelicManager，遗物系统将无法使用！");
        }
        Debug.Log("== 战斗初始化完成，进入第一回合 ==");
        StartPlayerTurn();
    }
    // -----------------------------------------------------------------
    // 2. 玩家操作入口 (响应 UI 操作，流程整合)
    // -----------------------------------------------------------------

    /// <summary>
    /// 当 UI 通知玩家使用了某张卡牌时的处理入口。
    /// </summary>
    public void PlayerUsedCard(Card card, ITarget target)
    {
        // 1. 目标检查
        if (target == null && card.targetType != TargetType.Self)
        {
            Debug.LogWarning("卡牌 " + card.name + " 无效，无目标");
            return;
        }
        // 2.组装目标列表（支持未来扩展到AllEnemies/RandomEnemy)
        List<ITarget> targets = new List<ITarget>();
        if (target != null)
        {
            targets.Add(target);
        }
        // 3. 将控制权交给CardManager处理
        // CardManager.UseCard 负责处理能量检查、消耗、OnUse效果执行，并将卡牌放入弃牌堆。
        cardManager.UseCard(card, player, targets);
        if (CheckBattleEnd())
        {
            HandleBattleEnd();
        }
    }
    // -----------------------------------------------------------------
    // 3. 回合流程管理
    // -----------------------------------------------------------------
    public void StartPlayerTurn()
    {
        if (CheckBattleEnd()) return;
        currentTurn++;
        Debug.Log($"--- 回合 {currentTurn}: 玩家回合开始 ---");

        // 1. 玩家回合开始前逻辑 (重置能量)
        player.StartTurn(); // PlayerData 中实现的 StartTurn 包含了能量重置

        // [新增] 通知遗物管理器回合开始
        FindObjectOfType<RelicManager>()?.OnTurnStart();

        // 2. 触发回合开始 Buff 效果
        effectSystem.TriggerAtTurnStart(player);

        // 3. 玩家抽牌 (CardSystem 模块)
        cardManager.DrawCard(cardManager.initialHandSize);

        // TODO: UI 事件通知 OnPlayerTurnStarted
    }
    public void EndPlayerTurn()
    {
        Debug.Log("--- 玩家回合结束 ---");

        // 1. 触发回合结束 Buff 效果 (您负责在 EffectSystem 中实现)
        effectSystem.TriggerAtTurnEnd(player);

        // 2. 将手牌弃置 (CardSystem 模块)
        cardManager.EndTurn();
        player.EndTurn(); // PlayerData 中实现的 EndTurn 包含日志等

        // 3. 进入敌人回合
        StartEnemyTurn();
    }
    public void StartEnemyTurn()
    {
        Debug.Log("--- 敌人回合开始 ---");
        // 1. 敌人行动（调用effectSys）
        // TODO: 第二阶段：先调用 IntentSystem 计算意图，并通知 UI
        foreach (var enemy in enemies.Where(e => e.IsAlive()))
        {
            // 伪代码:敌人对玩家进行基础攻击
            // 体现了战斗逻辑，调用effectSys将敌人意图转化为上海
            effectSystem.ApplyDamage(
                source: enemy,
                target: player,
                baseAmout: enemy.attackPower //使用enemydata中定义的攻击力
            );
            player.OnHPChanged?.Invoke(player.currentHP);
        }
        EndEnemyTurn();
    }
    public void EndEnemyTurn()
    {
        Debug.Log("--- 敌人回合结束 / 回合清理 ---");

        // 1. 清除所有目标的格挡 (核心清理逻辑)
        player.Block = 0;
        enemies.ForEach(e => e.Block = 0);

        // 2. 触发 Buff 持续时间递减 / 移除逻辑 
        effectSystem.TriggerAtTurnEnd(player);
        enemies.ForEach(e => effectSystem.TriggerAtTurnEnd(e));

        // 3. 检查战斗是否结束
        if (CheckBattleEnd())
        {
            HandleBattleEnd();
            
        }
        else
        {
            // 4. 回到玩家回合
            StartPlayerTurn();
        }
    }
    // -----------------------------------------------------------------
    // 4. 战斗结束判定与处理
    // -----------------------------------------------------------------

    public bool CheckBattleEnd()
    {
        bool playerDead = player.currentHP <= 0;
        bool allEnemiesDead = enemies.All(e => e.currentHP <= 0); 

        if (playerDead)
        {
            Debug.Log("战斗结束：玩家失败。");
            return true;
        }
        
        if (allEnemiesDead)
        {
            Debug.Log("战斗结束：所有敌人被击败！");
            return true;
        }

        return false;
    }

    private void HandleBattleEnd()
    {
        Debug.Log("--- 战斗结算处理中 ---");
        bool playerWon = player.currentHP > 0;
        // [新增] 战斗结束，立即保存当前状态到全局数据
        if(player != null && BattleLoader.playerData != null)
        {
            player.DeepCopyTo(BattleLoader.playerData);
        }
        BattleResult result = new BattleResult
        {
            isVictory = playerWon,
            isBossBattle = false, // 从 BattleLoader 获取
            isEliteBattle = false, // 从 BattleLoader 获取
            nodeType = NodeType.Learning, // 从 BattleLoader 获取
            playerFinalHP = player.currentHP,
            playerMaxHP = player.maxHP,
            turnsTaken = currentTurn
        };
        FindObjectOfType<GameManager>().OnBattleFinished(result);
        
        StartCloseBattleSequence();

        

       

        
        // TODO: 通知 GameManager 切换场景
        //// 通知 GameManager
        //FindObjectOfType<GameManager>().OnBattleFinished(result);
    }

    // 方法：等待2秒后关闭战斗界面
    IEnumerator CloseBattleWithDelay()
    {
        Debug.Log("开始等待2秒...");

        // 等待2秒
        yield return new WaitForSeconds(2f);

        // 关闭战斗界面
        battlePage.SetActive(false);
        Debug.Log("battlePage is closed");

        rewardPage.SetActive(true);
    }

    // 调用这个方法开始流程
    public void StartCloseBattleSequence()
    {
        StartCoroutine(CloseBattleWithDelay());
    }

    
}